

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;

import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JSeparator;
import javax.swing.ImageIcon;

import cho114366.swing.AboutProject;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

//스윙 시나리오
// 1. 제목표시줄 설정 : setTitle
// 2. 프로그램 크기 및 위치 설정 : setBounds
//    x좌표, y좌표, 가로크기, 세로크기
// 3. 프레임 크기 변경불가: setResizable(false)
// 4. 프로그램 아이톤 설정 : setIconImage png크기는 48 X ...
// 5. splach 화면 설정
//	  META-INF 폴더에 
//	  MANIFEST.MF 파일 작성
//	  SplashScreen-Image : 항목 추가
//	  splash 화면 뜨는 시간 : Thread.sleep(2500)
//	  File - export : java -jar
// 6.LOOK And Feel 변경
//	  룩앤필 : gui 측면과 디자인 구성에 사용하는 용어
//	  즉, 색상, 모양, 레이아웃, 서체, 버튼,
//	  메뉴둥의 동적요소를 의미
//	 Swing에서 제공하는 룩앤필은 밋밋하기 때문에
//	  이것을 교체하는 특별한 API를 제공
//	  UIManager.setLookAndFeel()
// 7. 프레임 닫기 이벤트 처리
//	   프레임 닫기시 이벤트를 걸고 싶으면 
//	  WindowListener - windowClosing을 사용
//	   하지만, 편의성을 위해 windowAdapter를
//	   사용하는 것을 추천!
// 8. 메뉴추가
//    추가 순서 : JMenuBar - JMenu - JMenuItem
//    JMenuBar 객체 생성 - JFrame에 setJMenuBar로 등록
//    JMenu 객체 생성 - JMenuBar에 add로 등록
//    JMenuItem 객체 생성 - JMenu에 add로 등록
//    JMenuItem의 setIcon을 이용해서 아이콘 등록
//    JMenuItem의 setEnable을 이용해서 메뉴 활성 여부 지정
//    JMenuItem의 addActionListener를 이용해서 메뉴 클릭 시 처리 할 이벤트 지정
// 9. 대화 상자 표시
//    JDialog 를 이용해서 대화 상자를 만들고
//    setVisible 로 화면에 표시
//    JDialog 창을 닫을 때는 dispose() 이용
// 10. JLabel
//    문자열을 출력할 때 또는 이미지를 출력할 때 사용
//    이미지 출력 시 setIcon 을 이용
//    그림이 클 경우 나머지 영역은 잘려서 보이지 않을 수 있음
//    문자열 출력 시 setText를 이용
//    여러 줄 출력 시 문장 시작 전 <html><pre> 를 추가한 후 작성하고 문장 끝에 </pre></html>을 추가해 준다.
//    글자 색상은 setForeground로 글자 폰트나 모양은 setFont로 작성
// 11. 화면 정 중앙에 표시
//    setLocationRelativeTo(null) 로 설정



public class SwingProject extends JFrame {

	private JPanel contentPane;
	
	private static final String METAL = "javax.swing.plaf.metal.MetalLookAndFeel"; // 6a
	private static final String NIMBUS = "javax.swing.plaf.nimbus.NimbusLookAndFeel"; // 6a
	

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Thread.sleep(2500); // 5. Thread 타임 제어
					// 룩앤필 변경 시작 6b
					JFrame.setDefaultLookAndFeelDecorated(true);
					JDialog.setDefaultLookAndFeelDecorated(true); // 6c
					UIManager.setLookAndFeel(METAL);
					// UIManager.setLookAndFeel(NIMBUS);
					// 룩앤필 변경 끝 6b
					SwingProject frame = new SwingProject();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public SwingProject() {
		setIconImage(Toolkit.getDefaultToolkit().getImage(SwingProject.class.getResource("/rkdwogus7/swing/images/splash/splash.png")));
		setTitle("스윙프로젝트 v1"); // 1
		
		// setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 7
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // 7
		// 닫기 버튼 클릭 시 이벤트 처리 시작 // 7
		addWindowListener(
				// 윈도우 발생하는 이벤트를 감시하기 위해 WindowListener 추가
				new WindowAdapter() {
			
					// 이벤트 발생시 그것을 처리하는
					// 메서드를 호출하기 위해
					// 기본 클래스로 정의된
					//WIndowAdapter 클래스 생성
				@Override
				public void windowClosing(WindowEvent e) {
					JFrame f = (JFrame)e.getSource();
						// 이벤트를 발생시킨 주체가 누군지 알아냄
					int choice = JOptionPane.showConfirmDialog(f, "정말로 끝내시겠습니까",
							"프로그램 종료", JOptionPane.YES_NO_OPTION);
					// 확인, 취소 버튼으로 이루어진 대화 상자를 모달창으로 표시
					if (choice == JOptionPane.YES_OPTION) {
						f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
						// 대화 상자에서 '확인'버튼을 클릭하며
						// 현재 프레임을 닫고 프로그램 종료
					}
					}// closing
				// 윈도우가 닫히는 이벤트 발생 시 WindowClosing method로 처리
					
				}// adapter
			); // Listener
			// 닫기 버튼 클릭 시 이벤트 처리 끝 // 7
		
		setBounds(100, 100, 800, 600); // 2
		setResizable(false); // 3
		setLocationRelativeTo(null);
		
		// 8. 메뉴 추가 시작
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		JMenu mnFile = new JMenu(" 파 일 (F) ");
		menuBar.add(mnFile);
		
		JMenuItem miNew = new JMenuItem(" 새로만들기 (N) ");
		miNew.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(null, "준비중 입니다!");
				// 간단한 메시지 대화 상자 출력
				// 여러 가지 이벤트가 발생할 수도 있으니 이 부분은 책을 보면서 공부해 보도록
				// 아이콘 변경도 책에 나와. 이걸 제대로 하려면 비주얼 C++같은 거 많으니 우린 여기서 딱히 신경은 안쓸거야.
			}
		});
		miNew.setIcon(new ImageIcon(SwingProject.class.getResource("/rkdwogus7/swing/images/menu/new.png")));
		mnFile.add(miNew);
		
		JSeparator separator = new JSeparator();
		mnFile.add(separator);
		
		JMenuItem miOpen = new JMenuItem(" 열 기 (O) ");
		mnFile.add(miOpen);
		
		JMenuItem miSave = new JMenuItem(" 저 장 (S) ");
		mnFile.add(miSave);
		
		JSeparator separator_2 = new JSeparator();
		mnFile.add(separator_2);
		
		JMenuItem miPrint = new JMenuItem(" 인 쇄 (P) ");
		mnFile.add(miPrint);
		
		JSeparator separator_1 = new JSeparator();
		mnFile.add(separator_1);
		
		JMenuItem miExit = new JMenuItem(" 끝내기 (X) ");
		miExit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				int choice = JOptionPane.showConfirmDialog(null, "정말로 끝내시겠습니까",
						"프로그램 종료", JOptionPane.YES_NO_OPTION);
				
				if (choice == JOptionPane.YES_OPTION)
					
				System.exit(0);
			}
			// 끝내기 버튼을 누르면 이벤트 발생. 이벤트 발생하면 창이 뜨면서 다시 확인
			// yes option 선택하면 프로그램 종료 까지
		});
		miExit.setIcon(new ImageIcon(SwingProject.class.getResource("/rkdwogus7/swing/images/menu/exit.png")));
		mnFile.add(miExit);
		
		JMenu mnEdit = new JMenu(" 편 집 (E) ");
		menuBar.add(mnEdit);
		
		JMenuItem miUturn = new JMenuItem(" 실행 취소 (U) ");
		miUturn.setEnabled(false);
		mnEdit.add(miUturn);
		
		JSeparator separator_3 = new JSeparator();
		mnEdit.add(separator_3);
		
		JMenuItem miTake = new JMenuItem(" 잘라내기 (T) ");
		mnEdit.add(miTake);
		
		JMenuItem miCopy = new JMenuItem(" 복 사 (C) ");
		mnEdit.add(miCopy);
		
		JMenuItem miPaste = new JMenuItem(" 붙여 넣기 (P)");
		mnEdit.add(miPaste);
		
		JMenuItem miDelete = new JMenuItem(" 삭 제 (L)");
		mnEdit.add(miDelete);
		
		JMenu mnView = new JMenu(" 보 기 (V) ");
		menuBar.add(mnView);
		
		JMenuItem miState = new JMenuItem(" 상태표시줄 (S)");
		mnView.add(miState);
		
		JMenu mnLayout = new JMenu(" 배치관리자 (L)");
		menuBar.add(mnLayout);
		
		JMenuItem miFlow = new JMenuItem("Flow Layout (F)");
		miFlow.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Flow_Layout flow = new Flow_Layout();
				flow.setVisible(true);	 // 9
			}
		});
		
		mnLayout.add(miFlow);
		
		JMenuItem miBorder = new JMenuItem("Border Layout (B)");
		miBorder.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Border_Layout border = new Border_Layout();
				border.setVisible(true);	 // 9
			}
		});
		
		mnLayout.add(miBorder);
		
		JMenuItem miCard = new JMenuItem("Card Layout (C)");
		miCard.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Card_Layout card = new Card_Layout();
				card.setVisible(true);	 // 9
			}
		});
		
		mnLayout.add(miCard);
		
		JMenuItem miGrid = new JMenuItem("Grid Layout (G)");
		miGrid.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Grid_Layout grid = new Grid_Layout();
				grid.setVisible(true);	 // 9
			}
		});
		
		mnLayout.add(miGrid);
		
		JMenu mnTool = new JMenu(" 도 구 (T)");
		menuBar.add(mnTool);
		
		JMenu mnHelp = new JMenu(" 도움말 (H) ");
		menuBar.add(mnHelp);
		
		JMenuItem miSeeHelp = new JMenuItem(" 도움말 보기 (H)");
		mnHelp.add(miSeeHelp);
		
		JSeparator separator_4 = new JSeparator();
		mnHelp.add(separator_4);
		
		JMenuItem miInfo = new JMenuItem(" 메모장 정보 (A)");
		mnHelp.add(miInfo);
		
		JMenuItem miAbout = new JMenuItem(" 스윙 프로젝트에 관하여");
		miAbout.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				AboutProject about = new AboutProject();
				about.setVisible(true);	 // 9
			}
		});
		miAbout.setIcon(new ImageIcon(SwingProject.class.getResource("/rkdwogus7/swing/images/menu/close.png")));
		mnHelp.add(miAbout);
		// 8. 메뉴 추가 끝
		
		
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
	}
	
	

}




